<template>
	<view v-show="showLog">
		<view style="text-align: center;">---- 标签打印状态Log ----</view>
		<view>任务状态:{{taskState == 1 ? "执行中" : "停止"}}</view>
		<view>执行进度:{{printNumState.progress}}% ({{printNumState.currentPrintNum}}/{{printNumState.totalPrintNum}})
		</view>
		<view>任务队列:剩余{{taskQueue.length + taskState}}个</view>
	</view>
</template>
<script>
	import {
		getTableData
	} from "./common/table_template.js";
	import {
		tablePrepareSend
	} from "./common/table_send.js";
	let SUCCESS = {
		code: 0,
	}
	let ERROR = function error(msg) {
		return {
			code: 1,
			msg: msg
		}
	}
	export default {
		data() {
			return {
				taskQueue: [], //执行任务队列
				taskState: 0, //任务状态 0.停止 1.执行中
				printNumState: {
					progress: 0, //当前打印实时进度 50%（当前执行中任务的进度）
					currentPrintNum: 0, //当前完成数量（执行中任务）
					totalPrintNum: 0, //当前总打印数量（执行中任务）
				},

			};
		},
		props: {
			//是否显示调试log
			showLog: {
				type: Boolean,
				default: false
			},
			//蓝牙核心连接信息
			bleInfo: {
				type: Object,
				default: {
					deviceState: 0, //连接状态，1.已连接，0.未连接
					deviceName: "", //当前连接的蓝牙名称
					deviceId: "", //当前连接的蓝牙地址
					writeCharaterId: "",
					writeServiceId: "",
					notifyCharaterId: "",
					notifyServiceId: "",
					readCharaterId: "",
					readServiceId: "",
					platform: "",
				}
			},
		},
		created() {
			//初始化
		},
		methods: {
			/**
			 * 检查打印机可用状态
			 * @param {Object} fun
			 */
			checkDeviceState(fun) {
				if (this.bleInfo.deviceState == 0) {
					fun(ERROR("未连接打印机"));
					return false;
				}
				return true;
			},

			// -------------------------------打印标签
			/**
			 * 打印标签
			 * @param {Object} tableValue
			 * @param {Object} fun 回调函数（res,tableValue,printNumState）
			 */
			sendBleLabel(tableValue, fun) {
				if (!this.checkDeviceState(fun)) {
					return;
				}
				let that = this;
				// 添加到发送队列
				this.taskQueue.push(async () => {
					await that.sendTableData(tableValue, fun);
				});
				this.executeTaskQueue(true);
			},
			/**
			 * 打印标签测试页
			 * @param {Object} fun 回调函数（res）
			 * @param {Object} templateId 支持指定模板测试 所有值为 XXXX
			 */
			sendBleLabelTest(fun, tableItem = {
				config: null,
				templateId: 1
			}) {
				if (!this.checkDeviceState(fun)) {
					return;
				}
				let that = this;
				let tableValue = {
					config: tableItem.config, //模板配置
					tables: [{
						templateId: tableItem.templateId, //标签测试页
						values: [
							"XXXX", "XXXX", "XXXX", "XXXX", "XXXX",
							"XXXX", "XXXX", "XXXX", "XXXX", "XXXX",
							"XXXX", "XXXX", "XXXX", "XXXX", "XXXX",
						]
					}]
				}
				// 添加到发送队列
				this.taskQueue.push(async () => {
					await that.sendTableData(tableValue, fun);
				});
				this.executeTaskQueue(true);
			},
			/**
			 * 打印标签自检页
			 * @param {Object} fun 回调函数（res）
			 */
			sendBleLabelSelfTest(fun) {
				if (!this.checkDeviceState(fun)) {
					return;
				}
				let that = this;
				let tableValue = {
					tables: [{
						templateId: 999, //标签自检页
					}]
				}
				// 添加到发送队列
				this.taskQueue.push(async () => {
					await that.sendTableData(tableValue, fun);
				});
				this.executeTaskQueue(true);
			},

			/**
			 * 打印机配置（自动队列）
			 * @param {Object} printerConfig 为 {} 则恢复默认设置
			 * @param {Object} fun
			 */
			setPrinterConfig(printerConfig, fun) {
				if (!this.checkDeviceState(fun)) {
					return;
				}
				if (!printerConfig) {
					fun(ERROR("打印机配置不存在！"));
					return;
				}
				let that = this;
				let tableValue = {
					config: printerConfig, //打印机配置
					tables: [{
						templateId: 0, //打印机配置
					}]
				}
				// 添加到发送队列
				this.taskQueue.push(async () => {
					await that.sendTableData(tableValue, fun);
				});
				this.executeTaskQueue(true);
			},


			// 执行任务队列
			async executeTaskQueue(init) {
				if (init && this.taskState == 1) {
					return;
				}
				if (this.taskQueue.length > 0) {
					this.taskState = 1;
					const task = this.taskQueue.shift();
					// 执行任务
					await task();
					// 延迟执行下一个任务
					setTimeout(await this.executeTaskQueue, 5000);
				} else {
					this.taskState = 0;
				}
			},
			/**
			 * 执行发送到打印机处理
			 * @param {Object} tableValue
			 * @param {Object} fun 回调函数
			 */
			async sendTableData(tableValue, fun) {
				await new Promise(async (resolve) => {
					// 准备模板数据
					let tableBuff = getTableData(tableValue);
					// 准备发送数据
					let timeout = 10 * 1000; //发送超时时间
					let timeoutId = setTimeout(function() {
						fun(ERROR("发送打印数据超时,请重试"), tableValue);
					}, timeout); //超过10秒无回调判断为超时;
					tablePrepareSend(tableBuff, this.bleInfo, (res, printNumState) => {
						clearTimeout(timeoutId); //清除超时标识
						timeoutId = setTimeout(function() { //更新超时标识
							fun(ERROR("发送打印数据超时,请重试"), tableValue);
							resolve();
						}, timeout);
						//回调结果， 执行完成 或 执行进度%
						if (res.code == 0) {
							//同步执行进度
							this.printNumState = printNumState;
							this.printNumState.progress = this.calculatePercentage(printNumState
								.currentPrintNum, printNumState.totalPrintNum);
							fun(res, tableValue, this.printNumState);
							if (printNumState.currentPrintNum == printNumState.totalPrintNum) {
								clearTimeout(timeoutId); //清除超时标识
								resolve(); //当前任务全部结束时候调用！
							}
						} else {
							fun(res, tableValue);
							clearTimeout(timeoutId); //清除超时标识
							resolve(); //当前任务全部结束时候调用！
						}
					});
				});
			},



			// command.setSelfTest(); //自检页
			// command.setSize(config.sizeX, config.sizeY) //设置标签大小，单位mm.具体参数请用尺子量一下
			// command.setGap(config.gap) //设置两个标签之间的间隙，单位mm.具体参数请用尺子量一下
			// setSpeed //速度
			// setDensity //浓度



			/**
			 * 计算百分比
			 * @param {Object} completedTasks
			 * @param {Object} totalTasks
			 */
			calculatePercentage(completedTasks, totalTasks) {
				if (totalTasks === 0) {
					return 0;
				}
				var percentage = (completedTasks / totalTasks) * 100;
				return percentage.toFixed(2); // 保留两位小数
			},
			/**
			 * 线程等待
			 */
			async sleep(time = 1000) {
				await new Promise(resolve => setTimeout(resolve, time));
			},

		}
	}
</script>

<style>

</style>